\documentclass{ctexart}
\usepackage{fancyvrb}
\DefineShortVerb{\|}


\begin{document}
	\section{与$\backslash$write18 有关的小事}

	\subsection{$\backslash$write 是 TeX 引擎的一个原语[1]，语法[2]是}
    \begin{verbatim}
        write<number><general text>
    \end{verbatim}
    
    功能是把内容写入外部文件（此处有简化）。其中，<number> 的范围是 0-15（luatex 将其拓展到了 0-255）[3]。
    
    例如，执行以下例子，会创建文件 main.wrt，并向其中写入内容 abc。

    \begin{verbatim}
% main.tex
$\backslash$documentclass{article}

$\backslash$begin{document}
	$\backslash$immediate$\backslash$openout0=$\backslash$jobname.wrt
	$\backslash$immediate$\backslash$write0{abc}
	$\backslash$immediate$\backslash$closeout0
	
	$\backslash$null层
$\backslash$end{document}
    \end{verbatim}

    \subsection{$\backslash$write18 是一个特殊的 $\backslash$write}
    它可以在终端执行 <general text>, 这就带来了安全隐患。

    \subsection{安全性和便捷性}
    从 TeX Live 2009 和 MikTeX v2.9 开始，restricted $\backslash$write18 模式被加入，它「只允许 $\backslash$write18 执行白名单中命令」。

    \subsection{小结}
    现在我们有了三种模式：完全不启用（f）、受限启用（p）、完全启用（t）。
    
    在 TeX Live 里，可以这样查看当前使用的 $\backslash$write18 模式，和受信任的命令清单：
    
    
    \begin{verbatim}
\$ kpsewhich --var-value shell\_escapep

\$ kpsewhich --var-value shell\_escape\_commands
bibtex,bibtex8,extractbb,gregorio,kpsewhich,makeindex,repstopdf,r-mpost,texosquery-jre8,
    \end{verbatim}

    这些配置，记录在配置文件 texmf.cnf 中。
    标准配置文件包含完整的配置列表和注释说明，位于 $TEXMFDIST/web2c/texmf.cnf。 用户配置文件有更高的优先级，位于 $TEXMFDIST/../texmf.cnf 

    以下命令会按照优先级递减的顺序，依次列出所有正在使用的 texmf.cnf 文件。
    
    \begin{verbatim}
    kpsewhich -all texmf.cnf
    \end{verbatim}
    
    在需要修改配置时，既可以执行命令 tlmgr conf texmf <varible> <value>，也可以直接修改用户配置文件。
    
    每次编译，在 log 的第二行位置，都有当前的 $\backslash$write18 模式信息，例如

    \begin{verbatim}
This is XeTeX, Version 3.14159265-2.6-0.999991 (TeX Live 2019) (preloaded format=xelatex 2019.5.4)  13 JUL 2019 11:43
entering extended mode
restricted $\backslash$write18 enabled.
    \end{verbatim}

    \subsection{命令参数}
    用户更为熟悉的可能是作为编译命令参数的 -shell-escape（texlive）或 --enable-write18（miktex）。它们被用来在单次编译中临时改变 write18 模式。

    \subsection{相关阅读}
    
    LaTeX2e unofficial reference manual (November 2018), Sec. 27.5.3 $\backslash$write18当我们在谈及类似ShareLaTeX的工具时，我们需要的是什么？，李阿玲What does $\backslash$write18 mean?, Joseph WrightAnswer to TeX-SX question What does “restricted $\backslash$write18 enabled” mean and why does TexLive keep reporting it?, David CarlisleLaTeX package bashful, ex­e­cute Unix bash shell scripts from within LaTeX. 

    \subsection{范例}
    %
    % https://github.com/gpoore/minted/commit/face2bed0b38194d3dddb76452c7f48fc7428d00
    % \newcommand\minted@pygmentize[2][\jobname.pyg]{
    %   构造命令
    %   \def\minted@cmd{
    %     pygmentize -l #2 -f latex -F tokenmerge
    %	  \minted@opt{gobble}
    %     \minted@opt{texcl}
    %     \minted@opt{mathescape}
    %	  \minted@opt{linenos}
    %     -P "verboptions=\minted@opt{extra}"
    %    这里命令输出的文件为 \jobname.out.pyg
    %	  -o \jobname.out.pyg #1
    %   }
    %
    %   执行命令
    %   \immediate\write18{\minted@cmd}
    %
    %   \ifthenelse{\equal{\minted@opt@bgcolor}{}}{}
    %   {\begin{minted@colorbg}{\minted@opt@bgcolor}}
    %
    %   将命令执行生成的结果引入进来
    %	\input{\jobname.out.pyg}
    %
    %	\ifthenelse{\equal{\minted@opt@bgcolor}{}}{}
    %	{\end{minted@colorbg}}
    %
    %   删除命令执行生成的文件
    %   \immediate\write18{rm \jobname.out.pyg}}
    %
    % ** 注意添加 -shell-escape 命令选项到 latex 中 **
    % 范例如下
    %

	\immediate\write18{echo "hello world"> a.tex}
	\input{a.tex}
	\immediate\write18{rm a.tex}
	 
\end{document} 